Webframeworkk/ASP.NET Core/Model Binding und Validation
Basierend auf der Analyse der Datei Text.txt bietet dieses Tutorial einen umfassenden Überblick über Model Binding und Validierung in ASP.NET Core MVC.
1. Einführung in Model Binding
Model Binding ist eine leistungsstarke Funktion in ASP.NET Core MVC, die den Prozess der Datenextraktion aus verschiedenen Teilen einer HTTP-Anfrage (Formulardaten, Routenwerte, Query Strings) automatisiert und in stark typisierte C#-Objekte konvertiert, die direkt in Action-Methoden verwendet werden können.
Wann wird Model Binding ausgeführt?
Es findet statt, nachdem das Routing bestimmt hat, welche Action-Methode aufgerufen werden soll. Das System versucht dann, die Parameter dieser Methode mit Werten aus der eingehenden Anfrage zu füllen.
Reihenfolge des Model Bindings
ASP.NET Core sucht in einer spezifischen Reihenfolge nach Datenquellen:
- Form Data (POST requests): Werte aus HTML-Formularen.
- Route Data: Werte aus der URL-Routen-Vorlage (z.B. /products/{id}).
- Query String: Werte, die an die URL angehängt sind (nach dem ?).
2. Datenquellen im Detail
Query Strings
- Zweck: Übergabe von Parametern über die URL (z.B. Filtern, Sortieren).
- Syntax: ?key1=value1&key2=value2
- Best Practices: Keine sensiblen Daten (Passwörter), einfache Namen verwenden, Input validieren.
Route Data
- Zweck: Erfassen dynamischer Werte aus der URL.
- Syntax: /products/{id}, wobei id ein Routenparameter ist.
- Best Practices: Klare Namen wählen, Constraints verwenden (z.B. int, guid).
URL Encoding
Spezielle Zeichen in URLs müssen encodiert werden (z.B. Leerzeichen als %20). Dies stellt sicher, dass URLs korrekt übertragen und interpretiert werden.
3. Explizite Binding-Attribute
Obwohl das automatische Binding oft ausreicht, können Sie mit Attributen genau steuern, woher die Daten kommen sollen.
- [FromQuery]: Weist den Model Binder an, den Wert ausschließlich aus dem Query String zu holen.
public IActionResult Index([FromQuery] int page) { ... }
- [FromRoute]: Weist den Model Binder an, den Wert aus den Routendaten zu holen.
[Route("products/{id}")]
public IActionResult Details([FromRoute] int id) { ... }
- [FromHeader]: Bindet Parameter direkt aus HTTP-Headern (z.B. User-Agent).
public IActionResult Index([FromHeader(Name = "User-Agent")] string userAgent) { ... }
- [FromBody]: Wird verwendet, um komplexe Objekte aus dem Request Body zu binden (z.B. JSON oder XML). Dies ist besonders wichtig für APIs.
public IActionResult Create([FromBody] Person person) { ... }
4. Model Validierung
Model Validation prüft, ob die empfangenen Daten den definierten Kriterien entsprechen. Dies ist entscheidend für Sicherheit und Datenintegrität.
Data Annotations
Verwenden Sie Attribute aus System.ComponentModel.DataAnnotations direkt in Ihren Modellklassen:
- [Required]: Feld darf nicht null oder leer sein.
- [StringLength]: Beschränkt die Länge eines Strings.
- [Range]: Definiert einen numerischen Bereich.
- [EmailAddress]: Prüft auf gültiges E-Mail-Format.
- [Phone]: Prüft auf Telefonnummer-Format.
- [Compare]: Vergleicht zwei Eigenschaften (z.B. Passwort und Bestätigung).
- [Url]: Prüft auf gültige URL.
ModelState
In Ihren Controller-Actions können Sie ModelState.IsValid prüfen.
public IActionResult Create(Person person)
{
if (!ModelState.IsValid)
{
return View(person); // Fehler anzeigen
}
// Speichern...
}
Fortgeschrittene Validierung
- Custom Validation Attributes: Erben Sie von
ValidationAttribute, um eigene Regeln zu erstellen (z.B. DateRangeValidator oder MinimumYearValidator). Man überschreibt dabei dieIsValid-Methode. - IValidatableObject: Für Validierung, die mehrere Eigenschaften betrifft (Cross-Property Validation), kann das Modell dieses Interface implementieren. Die
Validate-Methode wird aufgerufen, nachdem die Property-Level-Validierungen durchgelaufen sind.
5. Steuerung des Bindings
[Bind] und [BindNever]
- [Bind]: Gibt explizit an, welche Properties gebunden werden sollen (Whitelist). Schützt vor Overposting-Attacken.
public IActionResult Create([Bind("Title", "Description")] Product product)
- [BindNever]: Schließt spezifische Properties vom Binding aus (Blacklist). Wird direkt an der Model-Property notiert.
Collection Binding
ASP.NET Core kann Listen und Arrays binden (List<T>, T[]). Das Namensschema im Request muss passen:
- Indiziert: items[0], items[1]
- Gleicher Name: items, items
6. Erweiterte Themen
Input Formatters
Verantwortlich für das Deserialisieren des Request Body (z.B. JSON zu C#-Objekt).
- Standardmäßig ist NewtonsoftJsonInputFormatter oder SystemTextJsonInputFormatter aktiv.
- Für XML kann XmlSerializerInputFormatter konfiguriert werden (
.AddXmlSerializerFormatters()).
Custom Model Binders
Wenn das Standardverhalten nicht ausreicht, können Sie eigene Model Binder erstellen, indem Sie IModelBinder implementieren.
- BindModelAsync: Enthält die Logik zum Auslesen der Daten aus dem
bindingContext. - Ein
IModelBinderProviderwird benötigt, um den Binder zu registrieren.
Zusammenfassung
- Model Binding automatisiert die Datenannahme und Typkonvertierung.
- Validierung stellt sicher, dass nur korrekte Daten verarbeitet werden (
ModelState.IsValid). - Nutzen Sie Attribute ([FromQuery], [FromBody], etc.) für explizite Kontrolle.
- Sicherheit ist Priorität: Validieren und sanitisieren Sie immer alle Inputs.